//The MIT License
//
//Copyright (c) <2011> <GEPAR - Grupo de Ensino e Pesquisa em Agroinformática e Rastreabilidade>
//
//Permission is hereby granted, free of charge, to any person obtaining a copy
//of this software and associated documentation files (the "Software"), to deal
//in the Software without restriction, including without limitation the rights
//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
//copies of the Software, and to permit persons to whom the Software is
//furnished to do so, subject to the following conditions:
//
//The above copyright notice and this permission notice shall be included in
//all copies or substantial portions of the Software.
//
//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
//THE SOFTWARE.

package gui;

import core.ConfigNovaTabul;
import core.TabulacaoDAO;
import java.awt.Color;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import javax.swing.JTabbedPane;

public class PanelConfigNovaTabul extends javax.swing.JPanel {

    /**
     * Objeto JTabbedPane que armazena referência ao JTabbedPane onde este panel está contido.
     */
    JTabbedPane tabPai;

    /**
     * Objeto TabulacaoDAO para acesso ao banco de dados local.
     */
    TabulacaoDAO tabulDAO = new TabulacaoDAO();

    // ids dos itens recuperados do banco de dados local
    // artifício necessário pois os itens são recuperados em ordem alfabética,
    // mas nem sempre os ids são sequênciais
    ArrayList<Integer> idsNomeProd = new ArrayList<Integer>();
    ArrayList<Integer> idsEntreposto = new ArrayList<Integer>();
    ArrayList<Integer> idsClassificacao = new ArrayList<Integer>();
    ArrayList<Integer> idsTiposCaixa = new ArrayList<Integer>();
    ArrayList<Integer> idsQtdeCaixa = new ArrayList<Integer>();
    ArrayList<Integer> idsRespColeta = new ArrayList<Integer>();
    ArrayList<Integer> idsRespColeta2 = new ArrayList<Integer>();
    
    /**
     * Construtor que prevê a inserção deste panel em um JTabbedPane.
     * @param tabPai JTabbedPane onde este panel está contido.
     */
    public PanelConfigNovaTabul(JTabbedPane tabPai)
    {
        this.initComponents();
        
        this.tabPai = tabPai;
        
        try
        {
            // populando os combo box com dados recuperados do banco local
            this.popularCbNomeProduto();
            this.popularCbEntreposto();
            this.popularCbClassificacao();
            this.popularCbTipoCaixa();
            this.popularCbQtdeCaixa();
            this.popularCbRespColeta();
            this.popularCbRespColeta2();
        }
        catch(Exception e)
        {
            JOptionPane.showMessageDialog(null, e.getMessage());
        }
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        lblTitulo = new javax.swing.JLabel();
        lblTipoCaixa = new javax.swing.JLabel();
        cbTipoCaixa = new javax.swing.JComboBox();
        lblQtdeCaixa = new javax.swing.JLabel();
        cbQtdeCaixa = new javax.swing.JComboBox();
        lblNomeProduto = new javax.swing.JLabel();
        lblClassificacao = new javax.swing.JLabel();
        cbClassificacao = new javax.swing.JComboBox();
        lblEntreposto = new javax.swing.JLabel();
        cbEntreposto = new javax.swing.JComboBox();
        lblRespColeta = new javax.swing.JLabel();
        cbRespColeta = new javax.swing.JComboBox();
        lblDataColeta = new javax.swing.JLabel();
        cbNomeProduto = new javax.swing.JComboBox();
        btnOk = new javax.swing.JButton();
        btnCancelar = new javax.swing.JButton();
        txtDataColeta = new javax.swing.JFormattedTextField();
        lblStatusData = new javax.swing.JLabel();
        lblRespColeta2 = new javax.swing.JLabel();
        cbRespColeta2 = new javax.swing.JComboBox();

        lblTitulo.setFont(new java.awt.Font("Tahoma", 1, 18));
        lblTitulo.setText("Nova Tabulação");

        lblTipoCaixa.setText("Tipo da caixa");

        lblQtdeCaixa.setText("Quantidade por caixa");

        lblNomeProduto.setText("Nome do produto");

        lblClassificacao.setText("Classificação");

        lblEntreposto.setText("Entreposto");

        lblRespColeta.setText("Responsável pela coleta 1");

        lblDataColeta.setText("Data da coleta");

        btnOk.setText("OK");
        btnOk.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnOkActionPerformed(evt);
            }
        });

        btnCancelar.setText("Cancelar");
        btnCancelar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnCancelarActionPerformed(evt);
            }
        });

        try {
            txtDataColeta.setFormatterFactory(new javax.swing.text.DefaultFormatterFactory(new javax.swing.text.MaskFormatter("##/##/####")));
        } catch (java.text.ParseException ex) {
            ex.printStackTrace();
        }
        txtDataColeta.setMinimumSize(new java.awt.Dimension(86, 28));
        txtDataColeta.setPreferredSize(new java.awt.Dimension(86, 28));

        lblStatusData.setText("Exemplo: 30/05/2011");

        lblRespColeta2.setText("Responsável pela coleta 2");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(lblTitulo)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                        .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                                .addGroup(layout.createSequentialGroup()
                                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                        .addComponent(lblQtdeCaixa)
                                        .addComponent(lblTipoCaixa)
                                        .addGroup(layout.createSequentialGroup()
                                            .addGap(2, 2, 2)
                                            .addComponent(lblClassificacao))
                                        .addComponent(lblEntreposto)
                                        .addComponent(lblNomeProduto))
                                    .addGap(48, 48, 48))
                                .addGroup(layout.createSequentialGroup()
                                    .addComponent(lblRespColeta)
                                    .addGap(18, 18, 18)))
                            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                                .addComponent(cbNomeProduto, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(cbQtdeCaixa, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(cbTipoCaixa, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(cbClassificacao, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(cbEntreposto, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(cbRespColeta, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                        .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                            .addComponent(lblRespColeta2)
                            .addGap(18, 18, 18)
                            .addComponent(cbRespColeta2, 0, 0, Short.MAX_VALUE)))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(btnOk)
                        .addGap(18, 18, 18)
                        .addComponent(btnCancelar))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(lblDataColeta)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(txtDataColeta, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(lblStatusData)))
                .addContainerGap(220, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(lblTitulo)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblNomeProduto)
                    .addComponent(cbNomeProduto, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblEntreposto)
                    .addComponent(cbEntreposto, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblClassificacao)
                    .addComponent(cbClassificacao, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblTipoCaixa)
                    .addComponent(cbTipoCaixa, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblQtdeCaixa)
                    .addComponent(cbQtdeCaixa, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(cbRespColeta, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lblRespColeta))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(cbRespColeta2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lblRespColeta2))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lblDataColeta)
                    .addComponent(txtDataColeta, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lblStatusData))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnOk)
                    .addComponent(btnCancelar))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
    }// </editor-fold>//GEN-END:initComponents

    private void btnOkActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnOkActionPerformed
        
        ConfigNovaTabul configNovaTab = new ConfigNovaTabul();

        // convertendo a data para o tipo
       if(configNovaTab.setDataColeta(txtDataColeta.getText()) == true)
       {
            // atribuindo os índices da configuração
            configNovaTab.setIdNomeProduto(this.idsNomeProd.get(this.cbNomeProduto.getSelectedIndex()));
            configNovaTab.setIdClassific(this.idsClassificacao.get(this.cbClassificacao.getSelectedIndex()));
            configNovaTab.setIdEntreposto(this.idsEntreposto.get(this.cbEntreposto.getSelectedIndex()));
            configNovaTab.setIdMetricaCaixa(this.idsTiposCaixa.get(this.cbTipoCaixa.getSelectedIndex()));
            configNovaTab.setIdQtdeCaixa(this.idsQtdeCaixa.get(this.cbQtdeCaixa.getSelectedIndex()));
            configNovaTab.setIdRespColeta(this.idsRespColeta.get(this.cbRespColeta.getSelectedIndex()));
            configNovaTab.setIdRespColeta2(this.idsRespColeta2.get(this.cbRespColeta2.getSelectedIndex()));

            // atribuindo os valores da configuração
            configNovaTab.setNomeProd((this.cbNomeProduto.getSelectedItem().toString()));
            configNovaTab.setEntreposto(this.cbEntreposto.getSelectedItem().toString());
            configNovaTab.setMetricaCaixa(this.cbTipoCaixa.getSelectedItem().toString());
            configNovaTab.setRespColeta(this.cbRespColeta.getSelectedItem().toString());
            configNovaTab.setRespColeta2(this.cbRespColeta2.getSelectedItem().toString());
            configNovaTab.setClassific(this.cbClassificacao.getSelectedItem().toString());
            configNovaTab.setQtdeCaixa(Float.parseFloat(this.cbQtdeCaixa.getSelectedItem().toString()));

            // adiciona-se uma janela do tipo PanelNovaTabulacao; a janela atual é fechada
            SimpleDateFormat formatData = new SimpleDateFormat("dd/MM/yyyy");
            this.tabPai.addTab(configNovaTab.getNomeProd() + " - " + formatData.format(configNovaTab.getDataColeta()),
                    new PanelNovaTabulacao(configNovaTab, this.tabPai));
            this.tabPai.remove(this);
       }
       else
       {
            // data em branco ou em formato inválido; a configuração é interrompida
            // e o usuário deve arrumar o erro
            this.lblStatusData.setForeground(Color.red);
            this.lblStatusData.setText("Campo em branco ou data inválida (use dd/mm/aaaa)");
       }
    }//GEN-LAST:event_btnOkActionPerformed

    private void btnCancelarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCancelarActionPerformed

        int confirmacao;
        confirmacao = JOptionPane.showConfirmDialog(this, "Você tem certeza que deseja fechar esta janela de " +
                "'Configuração de Nova Tabulação'?", "Fechar 'Configuração de Nova Tabulação'?",
                JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE);

        if (confirmacao == JOptionPane.OK_OPTION)
        {
            this.tabPai.remove(this);
        }
    }//GEN-LAST:event_btnCancelarActionPerformed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnCancelar;
    private javax.swing.JButton btnOk;
    private javax.swing.JComboBox cbClassificacao;
    private javax.swing.JComboBox cbEntreposto;
    private javax.swing.JComboBox cbNomeProduto;
    private javax.swing.JComboBox cbQtdeCaixa;
    private javax.swing.JComboBox cbRespColeta;
    private javax.swing.JComboBox cbRespColeta2;
    private javax.swing.JComboBox cbTipoCaixa;
    private javax.swing.JLabel lblClassificacao;
    private javax.swing.JLabel lblDataColeta;
    private javax.swing.JLabel lblEntreposto;
    private javax.swing.JLabel lblNomeProduto;
    private javax.swing.JLabel lblQtdeCaixa;
    private javax.swing.JLabel lblRespColeta;
    private javax.swing.JLabel lblRespColeta2;
    private javax.swing.JLabel lblStatusData;
    private javax.swing.JLabel lblTipoCaixa;
    private javax.swing.JLabel lblTitulo;
    private javax.swing.JFormattedTextField txtDataColeta;
    // End of variables declaration//GEN-END:variables

    /**
     * Recupera todos os produtos cadastrados no banco de dados local e os adiciona
     * a cbNomeProduto.
     */
    private void popularCbNomeProduto() throws Exception
    {
        ResultSet produtos = tabulDAO.obterProdutos();

        while (produtos.next())
        {
            this.idsNomeProd.add(produtos.getInt(1));
            this.cbNomeProduto.addItem(produtos.getString(2));
        }

        produtos.getStatement().close();
    }

    /**
     * Recupera todos os entrepostos cadastrados no banco de dados local e os adiciona
     * a cbEntreposto.
     */
    private void popularCbEntreposto() throws Exception
    {
        ResultSet entrepostos = tabulDAO.obterEntrepostos();

        while (entrepostos.next())
        {
            this.idsEntreposto.add(entrepostos.getInt(1));
            this.cbEntreposto.addItem(entrepostos.getString(2));
        }

        entrepostos.getStatement().close();
    }

    /**
     * Recupera todos as classificações (de qualidade de produto) cadastradas no banco de dados local
     * e os adiciona a cbClassificacao.
     */
    private void popularCbClassificacao() throws Exception
    {
        ResultSet classificacoes = tabulDAO.obterClassificacoes();

        while (classificacoes.next())
        {
            this.idsClassificacao.add(classificacoes.getInt(1));
            this.cbClassificacao.addItem(classificacoes.getString(2));
        }

        classificacoes.getStatement().close();
    }

    /**
     * Recupera todos os tipos de caixa (unidade de medida utilizada) cadastrados no banco de dados local
     * e os adiciona a cbTipoCaixa.
     */
    private void popularCbTipoCaixa() throws Exception
    {
        ResultSet tiposCaixa = tabulDAO.obterTiposCaixa();

        while (tiposCaixa.next())
        {
            this.idsTiposCaixa.add(tiposCaixa.getInt(1));
            this.cbTipoCaixa.addItem(tiposCaixa.getString(2));
        }

        tiposCaixa.getStatement().close();
    }

    /**
     * Recupera todos as quantidades (por caixa) cadastradas no banco de dados local
     * e os adiciona a cbQtdeCaixa.
     */
    private void popularCbQtdeCaixa() throws Exception
    {
        ResultSet qtdesCaixa = tabulDAO.obterQtdesCaixa();

        while (qtdesCaixa.next())
        {
            this.idsQtdeCaixa.add(qtdesCaixa.getInt(1));
            this.cbQtdeCaixa.addItem(qtdesCaixa.getInt(2));
        }

        qtdesCaixa.getStatement().close();
    }

    /**
     * Recupera todos os responsáveis por coleta cadastrados no banco de dados local
     * e os adiciona a cbRespColeta.
     */
    private void popularCbRespColeta() throws Exception
    {
        ResultSet responsaveisCol = tabulDAO.obterResponsaveisCol();

        while (responsaveisCol.next())
        {
            this.idsRespColeta.add(responsaveisCol.getInt(1));
            this.cbRespColeta.addItem(responsaveisCol.getString(2));
        }

        responsaveisCol.getStatement().close();
    }

    /**
     * Recupera todos os responsáveis por coleta cadastrados no banco de dados local
     * e os adiciona a cbRespColeta2.
     */
    private void popularCbRespColeta2() throws Exception
    {
        ResultSet responsaveisCol = tabulDAO.obterResponsaveisCol();

        this.idsRespColeta2.add(1);
        this.cbRespColeta2.addItem("-");

        while (responsaveisCol.next())
        {
            this.idsRespColeta2.add(responsaveisCol.getInt(1));
            this.cbRespColeta2.addItem(responsaveisCol.getString(2));
        }

        responsaveisCol.getStatement().close();
    }
}
